﻿//给你两个 非空 的链表，表示两个非负的整数。
//它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
//
//请你将两个数相加，并以相同形式返回一个表示和的链表。
//
//你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
//
//输入：l1 = [2, 4, 3], l2 = [5, 6, 4]
//输出：[7, 0, 8]
//解释：342 + 465 = 807.
//
//输入：l1 = [0], l2 = [0]
//输出：[0]
//
//输入：l1 = [9, 9, 9, 9, 9, 9, 9], l2 = [9, 9, 9, 9]
//输出：[8, 9, 9, 9, 0, 0, 0, 1]
//
//提示：
//	每个链表中的节点数在范围[1, 100] 内
//	0 <= Node.val <= 9
//	题目数据保证列表表示的数字不含前导零

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* cur1 = l1, * cur2 = l2;
        ListNode* newhead = new ListNode(0); // 创建⼀个虚拟头结点，记录最终结果

        ListNode* prev = newhead; // 尾指针

        int t = 0; // 记录进位
        while (cur1 || cur2 || t) {
            // 先加上第⼀个链表

            if (cur1) {
                t += cur1->val;
                cur1 = cur1->next;
            }
            // 加上第⼆个链表

            if (cur2) {
                t += cur2->val;
                cur2 = cur2->next;
            }
            prev->next = new ListNode(t % 10);
            prev = prev->next;
            t /= 10;
        }

        prev = newhead->next;
        delete newhead;
        return prev;
    }
};









